{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from PyPDF2 import PdfReader\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 获取pdf文件内容 /Users/mac/Downloads/【资深java开发工程师_杭州】袁业涵 7年.pdf\n",
    "def get_pdf_text(pdf):\n",
    "    text = \"\"\n",
    "    pdf_reader = PdfReader(pdf)\n",
    "    for page in pdf_reader.pages:\n",
    "        text += page.extract_text()\n",
    "    print(\"get_pdf_text \", pdf, len(text))\n",
    "    return text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "get_pdf_text  /Users/mac/Downloads/【资深java开发工程师_杭州】袁业涵 7年.pdf 3746\n",
      "基本信息  \n",
      "姓       名：袁业涵  / 男  / 1995\n",
      "工作经验： 7 年\n",
      "求职意向： Java 工程师\n",
      "政治面貌：党员\n",
      "手       机： 17280164205 （同微信）\n",
      "邮       箱： 1547849737@qq.com\n",
      "技术博客： https://www.youlike.tech/\n",
      " \n",
      "教育背景  \n",
      "2013.09 - 2017.06 ：中原工学院  / 软件工程  / 学士学位  \n",
      " \n",
      "技术清单  \n",
      "7年工作经验， 3 年小组管理经验，具有全栈开发能力，擅长订单、支付、 SAAS 等业务领域\n",
      "【Java】熟练掌握  Java 核心知识：集合、泛型、反射、 JUC 等\n",
      "【JVM】深入理解  JVM 底层原理，熟悉  JVM 各类垃圾收集器的使用和核心参数的调优，具备实际的  \n",
      "JVM 调优经验\n",
      "【设计模式】熟练掌握  Java 常用设计模式，具备良好的编码规范和设计原则\n",
      "【MySQL 】熟悉  MySQL 数据库，理解其索引、事务、 MVCC 、锁等机制，熟悉读写分离、分库分\n",
      "表等方案，有过线上  SQL 调优经验\n",
      "【Redis】熟练掌握  Redis ，理解  Redis 核心数据结构的使用场景，熟悉缓存雪崩、穿透等缓存高并\n",
      "发问题的解决方案，曾实现过分布式锁、延迟消息、幂等性、限流等特性。\n",
      "【微服务】熟练使用 SpringCloudAlibaba 、 Nacos 、 OpenFeign 、 Sentinel 、 Gateway 等搭建微服\n",
      "务框架进行整合开发\n",
      "【中间件】熟悉  RocketMQ 、 RabbitMQ 、 Kafka 等常用消息中间件，能够进行消息的异步解耦。熟\n",
      "练掌握分布式场景下的常见技术解决方案，比如  Seata 分布式事务、 XXL-Job 分布式任务调度、\n",
      "SkyWalking 分布式链路追踪\n",
      "【工具】掌握  Linux 常用命令，能够搭建  Nginx 服务器，使用过  Arthas 排查线上疑难问题\n",
      " \n",
      "工作经历  \n",
      "个人创业  | 2022.12 - 至今（ 1 年  4 月）  \n",
      "短暂且密集的工作经历，做了 3 个项目，进一步提升了自己的技术栈。6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr\n",
      "6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr\n",
      "城云科技（中国）有限公司  | Java 高级开发  | 2022.08 - 2022.11 （ 4 月）  \n",
      "开发维护联邦学习项目和算法训练项目\n",
      "杭州新视窗信息技术有限公司  | Java 开发副组长  | 2020.05 - 2022.05 （ 2 年  1 月）  \n",
      "作为小组副组长，保证需求开发进度， CodeReview 组员的代码，并指导优化。\n",
      "应收中台项目的基础核心架构的决策成员之一，引入新技术，保证项目的稳定性，可靠性，可用\n",
      "性。\n",
      "参与核心功能的设计与研发。\n",
      "北京合众伟奇科技有限公司  | Java 工程师  | 2017.07 - 2020.03 （ 2 年  9 月）  \n",
      "开发维护国家电网的智能运维系统。\n",
      " \n",
      "项目经历  \n",
      "道闸系统  \n",
      "项目描述 ：致力于解决物业公司关于小区和停车场停车的自动收费的项目。主要有两个业务，一是业主\n",
      "等固定人员的月卡收费，二是临时停车缴费。\n",
      "技术选型 ：微服务架构、 SpringCloudAlibaba 、 Nacos 、 Gateway 、 Kafka 、 MybatisPlus 、 XXL-Job 、 \n",
      "MySQL、 Redis 、 SkyWalking 、 Docker 等\n",
      "核心职责 ：\n",
      "作为项目负责人，带领 3 个组员从 0 到 1 进行开发。负责项目的整体架构设计，选择合适的技术框\n",
      "架，以保证系统具有高性能、高可用、易于拓展和维护\n",
      "利用模板方法  + 工厂  + 策略模式，封装统一的道闸流程，  实现与捷顺、科拓、红门等  10 余种道闸\n",
      "厂家的对接\n",
      "设计并实现月卡办理、月卡续费、临时停车等 API 的核心代码，使得业务方可以在平均  5PD 内完成\n",
      "接入。还提供接入示例，将接入时间进一步缩短到  3PD ，提升了接入效率与规范\n",
      "使用 Redisson 框架提供的分布式锁功能实现单个订单在同一时刻只允许一个线程回调，并通过  \n",
      "Kafka延迟消息实现多次通知，保证结果的及时性、可靠性。\n",
      "采用  XXL-Job 实现向支付渠道的主动轮询支付、退款状态，解决了支付异步回调可能存在延迟、掉\n",
      "单等问题，确保了状态的一致性\n",
      "本地消息表方案解决业户系统、道闸系统、支付系统服务之间的分布式事务问题，确保了数据的一\n",
      "致性。\n",
      "引入  SkyWalking 实现 “ 接入业务方 ↔ 支付服务 ↔ 支付渠道 ” 全链路可观测，将  SkyWalking 作为轻量\n",
      "级日志中心，提升线上问题的排查效率    \n",
      " \n",
      "应收中台  \n",
      "项目描述 ：此项目是一款前后端分离的，主要着力于提升物业公司日常收费效率的 SAAS 软件系统。前端\n",
      "VUE，后端微服务。分业户管理、财务管理、系统管理、凭证管理、票据管理等多个模块。目前已有 400\n",
      "多家物业公司入驻，其中包含碧桂园、恒大、绿城、新希望等等 50 多家百强物业公司，数据量庞大，以\n",
      "亿为单位。涉及高并发、高性能、高可用相关问题。\n",
      "6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr\n",
      "技术选型 ：微服务架构、 SpringCloudAlibaba 、 Nacos 、 Gateway 、 Sentinal 、 Kafka 、 MybatisPlus 、\n",
      "XXL-Job、  MySQL 、 Redis 、 Docker 等\n",
      "核心职责 ：\n",
      "接手业户模块，设计调整表结构，重构接近一半相关模块代码。使得该模块 BUG 率从 30% 降低到 5%\n",
      "以内。\n",
      "基于 EasyExcel + 线程池  + 批量插入实现百万级数据的导入，解决 POI 导入导致的内存溢出问题，使\n",
      "100万数据导入时间降低到 100 秒左右。\n",
      "设计 SAAS 多租户解决方案，数据隔离方案大客户采用 DATASOURCE 模式，小客户采用 COLUMN 模\n",
      "式。\n",
      "统一设计第三方接口流程规范，鉴权、加密、解密操作，提高系统和数据的安全性。\n",
      "参与设计开发基于 Sharding-JDBC 的分库分表方案，提高查询速度，改善用户体验。\n",
      "引入 Canal 框架结合消息队列 Kafka 解决冗余字段更新，实时增量的数据同步，记录数据的变更记录\n",
      "等业务场景。\n",
      "本地消息表方案解决业户系统、道闸系统、支付系统服务之间的分布式事务问题，确保了数据的一\n",
      "致性。\n",
      "基于 Redis 实现分布式锁，解决幂等性问题，保证数据的一致性。\n",
      "基于 Redis 实现高性能、低延迟的延时消息方案。\n",
      " \n",
      "国家电网智能运维系统  \n",
      "项目描述 ：此项目背景是为了使国家电网工作人员提高工作效率，减少人力成本，降低人为出错率，进\n",
      "行更加科学地更加智能地管理和运维。包含后台管理端和 APP 端。后台管理端功能模块包含：员工管理、\n",
      "日常工作管理、设备零件、备品备件、 3D 模型管理、库存、报警、维修、排班、检修、运维项、点检、\n",
      "保养、电能表误差分析、接线成功率分析、检定质量核查、故障库等等； APP 端功能包括：打卡签到、交\n",
      "接班、故障上报、工单、派工、维修通知、故障库等等。\n",
      "技术选型 ：Maven 、 SpringCloud 、 SpringBoot 、 Eureka 、 Feign 、 ActiveMQ 、 Mybatis 、 Quartz 、 \n",
      "MySQL、 Redis 等\n",
      "核心职责 ：\n",
      "Quartz开发定时任务，自动排班、检修任务、点检任务、运维计划等等\n",
      "Activity工作流实现故障上报、派工、接受、完成、转派工单等等。\n",
      "使用 Redis 的 zset 结构，实现故障库、备品库等的排序功能，提升寻找故障解决办法的效率。\n",
      "使用 Elasticsearch 实现故障库文档内容的搜索功能。\n",
      "Redis用作缓存，提升热点数据的查询速度，实现分布式锁，结合 lua 脚本解决幂等性问题。\n",
      "运用 ActiveMQ + freemarker + Websocket ，利用模板方法  + 工厂  + 策略模式实现短信、邮箱、站\n",
      "内信等信息通知。\n",
      "对传感器采集的数据，利用滑窗算法计算电能表误差分析、接线成功率分析是否超过指定阈值，前\n",
      "端SVG模型闪烁报警，并自动派单给维修人员进行检查维修。\n",
      " \n",
      "自我评价  \n",
      "工作积极认真，细心负责，有较强的分析和动手能力\n",
      "6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr\n",
      "适应能力强，心胸豁达，有很强的团队协作精神和与人沟通能力\n",
      "坚毅不拔，吃苦耐劳，喜欢和善于迎接新挑战\n",
      "6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr\n",
      "\n"
     ]
    }
   ],
   "source": [
    "pdf_path = \"/Users/mac/Downloads/【资深java开发工程师_杭州】袁业涵 7年.pdf\"\n",
    "pdf_text = get_pdf_text(pdf_path)\n",
    "print(pdf_text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    " \n",
    "# 拆分文本\n",
    "def get_text_chunks(text):\n",
    "    text_splitter = RecursiveCharacterTextSplitter(\n",
    "        chunk_size=500,\n",
    "        chunk_overlap=200,\n",
    "        length_function=len\n",
    "    )\n",
    "    chunks = text_splitter.split_text(text)\n",
    "    return chunks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "12\n",
      "['基本信息  \\n姓\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0名：袁业涵  / 男  / 1995\\n工作经验： 7 年\\n求职意向： Java 工程师\\n政治面貌：党员\\n手\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0机： 17280164205 （同微信）\\n邮\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0\\xa0箱： 1547849737@qq.com\\n技术博客： https://www.youlike.tech/\\n\\xa0\\n教育背景  \\n2013.09 - 2017.06 ：中原工学院  / 软件工程  / 学士学位  \\n\\xa0\\n技术清单  \\n7年工作经验， 3 年小组管理经验，具有全栈开发能力，擅长订单、支付、 SAAS 等业务领域\\n【Java】熟练掌握  Java 核心知识：集合、泛型、反射、 JUC 等\\n【JVM】深入理解  JVM 底层原理，熟悉  JVM 各类垃圾收集器的使用和核心参数的调优，具备实际的  \\nJVM 调优经验\\n【设计模式】熟练掌握  Java 常用设计模式，具备良好的编码规范和设计原则\\n【MySQL 】熟悉  MySQL 数据库，理解其索引、事务、 MVCC 、锁等机制，熟悉读写分离、分库分\\n表等方案，有过线上  SQL 调优经验', '【JVM】深入理解  JVM 底层原理，熟悉  JVM 各类垃圾收集器的使用和核心参数的调优，具备实际的  \\nJVM 调优经验\\n【设计模式】熟练掌握  Java 常用设计模式，具备良好的编码规范和设计原则\\n【MySQL 】熟悉  MySQL 数据库，理解其索引、事务、 MVCC 、锁等机制，熟悉读写分离、分库分\\n表等方案，有过线上  SQL 调优经验\\n【Redis】熟练掌握  Redis ，理解  Redis 核心数据结构的使用场景，熟悉缓存雪崩、穿透等缓存高并\\n发问题的解决方案，曾实现过分布式锁、延迟消息、幂等性、限流等特性。\\n【微服务】熟练使用 SpringCloudAlibaba 、 Nacos 、 OpenFeign 、 Sentinel 、 Gateway 等搭建微服\\n务框架进行整合开发\\n【中间件】熟悉  RocketMQ 、 RabbitMQ 、 Kafka 等常用消息中间件，能够进行消息的异步解耦。熟\\n练掌握分布式场景下的常见技术解决方案，比如  Seata 分布式事务、 XXL-Job 分布式任务调度、\\nSkyWalking 分布式链路追踪', '务框架进行整合开发\\n【中间件】熟悉  RocketMQ 、 RabbitMQ 、 Kafka 等常用消息中间件，能够进行消息的异步解耦。熟\\n练掌握分布式场景下的常见技术解决方案，比如  Seata 分布式事务、 XXL-Job 分布式任务调度、\\nSkyWalking 分布式链路追踪\\n【工具】掌握  Linux 常用命令，能够搭建  Nginx 服务器，使用过  Arthas 排查线上疑难问题\\n\\xa0\\n工作经历  \\n个人创业  | 2022.12 - 至今（ 1 年  4 月）  \\n短暂且密集的工作经历，做了 3 个项目，进一步提升了自己的技术栈。6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr\\n6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr\\n城云科技（中国）有限公司  | Java 高级开发  | 2022.08 - 2022.11 （ 4 月）  \\n开发维护联邦学习项目和算法训练项目', '6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr\\n城云科技（中国）有限公司  | Java 高级开发  | 2022.08 - 2022.11 （ 4 月）  \\n开发维护联邦学习项目和算法训练项目\\n杭州新视窗信息技术有限公司  | Java 开发副组长  | 2020.05 - 2022.05 （ 2 年  1 月）  \\n作为小组副组长，保证需求开发进度， CodeReview 组员的代码，并指导优化。\\n应收中台项目的基础核心架构的决策成员之一，引入新技术，保证项目的稳定性，可靠性，可用\\n性。\\n参与核心功能的设计与研发。\\n北京合众伟奇科技有限公司  | Java 工程师  | 2017.07 - 2020.03 （ 2 年  9 月）  \\n开发维护国家电网的智能运维系统。\\n\\xa0\\n项目经历  \\n道闸系统  \\n项目描述 ：致力于解决物业公司关于小区和停车场停车的自动收费的项目。主要有两个业务，一是业主\\n等固定人员的月卡收费，二是临时停车缴费。', '性。\\n参与核心功能的设计与研发。\\n北京合众伟奇科技有限公司  | Java 工程师  | 2017.07 - 2020.03 （ 2 年  9 月）  \\n开发维护国家电网的智能运维系统。\\n\\xa0\\n项目经历  \\n道闸系统  \\n项目描述 ：致力于解决物业公司关于小区和停车场停车的自动收费的项目。主要有两个业务，一是业主\\n等固定人员的月卡收费，二是临时停车缴费。\\n技术选型 ：微服务架构、 SpringCloudAlibaba 、 Nacos 、 Gateway 、 Kafka 、 MybatisPlus 、 XXL-Job 、 \\nMySQL、 Redis 、 SkyWalking 、 Docker 等\\n核心职责 ：\\n作为项目负责人，带领 3 个组员从 0 到 1 进行开发。负责项目的整体架构设计，选择合适的技术框\\n架，以保证系统具有高性能、高可用、易于拓展和维护\\n利用模板方法  + 工厂  + 策略模式，封装统一的道闸流程，  实现与捷顺、科拓、红门等  10 余种道闸\\n厂家的对接\\n设计并实现月卡办理、月卡续费、临时停车等 API 的核心代码，使得业务方可以在平均  5PD 内完成', '核心职责 ：\\n作为项目负责人，带领 3 个组员从 0 到 1 进行开发。负责项目的整体架构设计，选择合适的技术框\\n架，以保证系统具有高性能、高可用、易于拓展和维护\\n利用模板方法  + 工厂  + 策略模式，封装统一的道闸流程，  实现与捷顺、科拓、红门等  10 余种道闸\\n厂家的对接\\n设计并实现月卡办理、月卡续费、临时停车等 API 的核心代码，使得业务方可以在平均  5PD 内完成\\n接入。还提供接入示例，将接入时间进一步缩短到  3PD ，提升了接入效率与规范\\n使用 Redisson 框架提供的分布式锁功能实现单个订单在同一时刻只允许一个线程回调，并通过  \\nKafka延迟消息实现多次通知，保证结果的及时性、可靠性。\\n采用  XXL-Job 实现向支付渠道的主动轮询支付、退款状态，解决了支付异步回调可能存在延迟、掉\\n单等问题，确保了状态的一致性\\n本地消息表方案解决业户系统、道闸系统、支付系统服务之间的分布式事务问题，确保了数据的一\\n致性。\\n引入  SkyWalking 实现 “ 接入业务方 ↔ 支付服务 ↔ 支付渠道 ” 全链路可观测，将  SkyWalking 作为轻量', '采用  XXL-Job 实现向支付渠道的主动轮询支付、退款状态，解决了支付异步回调可能存在延迟、掉\\n单等问题，确保了状态的一致性\\n本地消息表方案解决业户系统、道闸系统、支付系统服务之间的分布式事务问题，确保了数据的一\\n致性。\\n引入  SkyWalking 实现 “ 接入业务方 ↔ 支付服务 ↔ 支付渠道 ” 全链路可观测，将  SkyWalking 作为轻量\\n级日志中心，提升线上问题的排查效率    \\n\\xa0\\n应收中台  \\n项目描述 ：此项目是一款前后端分离的，主要着力于提升物业公司日常收费效率的 SAAS 软件系统。前端\\nVUE，后端微服务。分业户管理、财务管理、系统管理、凭证管理、票据管理等多个模块。目前已有 400\\n多家物业公司入驻，其中包含碧桂园、恒大、绿城、新希望等等 50 多家百强物业公司，数据量庞大，以\\n亿为单位。涉及高并发、高性能、高可用相关问题。\\n6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr', 'VUE，后端微服务。分业户管理、财务管理、系统管理、凭证管理、票据管理等多个模块。目前已有 400\\n多家物业公司入驻，其中包含碧桂园、恒大、绿城、新希望等等 50 多家百强物业公司，数据量庞大，以\\n亿为单位。涉及高并发、高性能、高可用相关问题。\\n6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr\\n技术选型 ：微服务架构、 SpringCloudAlibaba 、 Nacos 、 Gateway 、 Sentinal 、 Kafka 、 MybatisPlus 、\\nXXL-Job、  MySQL 、 Redis 、 Docker 等\\n核心职责 ：\\n接手业户模块，设计调整表结构，重构接近一半相关模块代码。使得该模块 BUG 率从 30% 降低到 5%\\n以内。\\n基于 EasyExcel + 线程池  + 批量插入实现百万级数据的导入，解决 POI 导入导致的内存溢出问题，使\\n100万数据导入时间降低到 100 秒左右。\\n设计 SAAS 多租户解决方案，数据隔离方案大客户采用 DATASOURCE 模式，小客户采用 COLUMN 模\\n式。', '接手业户模块，设计调整表结构，重构接近一半相关模块代码。使得该模块 BUG 率从 30% 降低到 5%\\n以内。\\n基于 EasyExcel + 线程池  + 批量插入实现百万级数据的导入，解决 POI 导入导致的内存溢出问题，使\\n100万数据导入时间降低到 100 秒左右。\\n设计 SAAS 多租户解决方案，数据隔离方案大客户采用 DATASOURCE 模式，小客户采用 COLUMN 模\\n式。\\n统一设计第三方接口流程规范，鉴权、加密、解密操作，提高系统和数据的安全性。\\n参与设计开发基于 Sharding-JDBC 的分库分表方案，提高查询速度，改善用户体验。\\n引入 Canal 框架结合消息队列 Kafka 解决冗余字段更新，实时增量的数据同步，记录数据的变更记录\\n等业务场景。\\n本地消息表方案解决业户系统、道闸系统、支付系统服务之间的分布式事务问题，确保了数据的一\\n致性。\\n基于 Redis 实现分布式锁，解决幂等性问题，保证数据的一致性。\\n基于 Redis 实现高性能、低延迟的延时消息方案。\\n\\xa0\\n国家电网智能运维系统', '引入 Canal 框架结合消息队列 Kafka 解决冗余字段更新，实时增量的数据同步，记录数据的变更记录\\n等业务场景。\\n本地消息表方案解决业户系统、道闸系统、支付系统服务之间的分布式事务问题，确保了数据的一\\n致性。\\n基于 Redis 实现分布式锁，解决幂等性问题，保证数据的一致性。\\n基于 Redis 实现高性能、低延迟的延时消息方案。\\n\\xa0\\n国家电网智能运维系统  \\n项目描述 ：此项目背景是为了使国家电网工作人员提高工作效率，减少人力成本，降低人为出错率，进\\n行更加科学地更加智能地管理和运维。包含后台管理端和 APP 端。后台管理端功能模块包含：员工管理、\\n日常工作管理、设备零件、备品备件、 3D 模型管理、库存、报警、维修、排班、检修、运维项、点检、\\n保养、电能表误差分析、接线成功率分析、检定质量核查、故障库等等； APP 端功能包括：打卡签到、交\\n接班、故障上报、工单、派工、维修通知、故障库等等。\\n技术选型 ：Maven 、 SpringCloud 、 SpringBoot 、 Eureka 、 Feign 、 ActiveMQ 、 Mybatis 、 Quartz 、', '保养、电能表误差分析、接线成功率分析、检定质量核查、故障库等等； APP 端功能包括：打卡签到、交\\n接班、故障上报、工单、派工、维修通知、故障库等等。\\n技术选型 ：Maven 、 SpringCloud 、 SpringBoot 、 Eureka 、 Feign 、 ActiveMQ 、 Mybatis 、 Quartz 、 \\nMySQL、 Redis 等\\n核心职责 ：\\nQuartz开发定时任务，自动排班、检修任务、点检任务、运维计划等等\\nActivity工作流实现故障上报、派工、接受、完成、转派工单等等。\\n使用 Redis 的 zset 结构，实现故障库、备品库等的排序功能，提升寻找故障解决办法的效率。\\n使用 Elasticsearch 实现故障库文档内容的搜索功能。\\nRedis用作缓存，提升热点数据的查询速度，实现分布式锁，结合 lua 脚本解决幂等性问题。\\n运用 ActiveMQ + freemarker + Websocket ，利用模板方法  + 工厂  + 策略模式实现短信、邮箱、站\\n内信等信息通知。', '使用 Elasticsearch 实现故障库文档内容的搜索功能。\\nRedis用作缓存，提升热点数据的查询速度，实现分布式锁，结合 lua 脚本解决幂等性问题。\\n运用 ActiveMQ + freemarker + Websocket ，利用模板方法  + 工厂  + 策略模式实现短信、邮箱、站\\n内信等信息通知。\\n对传感器采集的数据，利用滑窗算法计算电能表误差分析、接线成功率分析是否超过指定阈值，前\\n端SVG模型闪烁报警，并自动派单给维修人员进行检查维修。\\n\\xa0\\n自我评价  \\n工作积极认真，细心负责，有较强的分析和动手能力\\n6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr\\n适应能力强，心胸豁达，有很强的团队协作精神和与人沟通能力\\n坚毅不拔，吃苦耐劳，喜欢和善于迎接新挑战\\n6c30c19b65ad46313nJ73N-7ElFXxoy2V_qCROWhm_XVMBlr']\n"
     ]
    }
   ],
   "source": [
    "pdf_chunks = get_text_chunks(pdf_text)\n",
    "print(len(pdf_chunks))\n",
    "print(pdf_chunks)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/mac/Library/Python/3.9/lib/python/site-packages/langchain_core/_api/deprecation.py:119: LangChainDeprecationWarning: The class `OpenAIEmbeddings` was deprecated in LangChain 0.0.9 and will be removed in 0.3.0. An updated version of the class exists in the langchain-openai package and should be used instead. To use it run `pip install -U langchain-openai` and import as `from langchain_openai import OpenAIEmbeddings`.\n",
      "  warn_deprecated(\n"
     ]
    }
   ],
   "source": [
    "from langchain.vectorstores import FAISS\n",
    "from langchain.embeddings import OpenAIEmbeddings\n",
    " \n",
    " \n",
    "embeddings = OpenAIEmbeddings(\n",
    "    openai_api_key=\"sk-uRUknVzF2daRmidJ227fEa256c5d4f4b9f9a7bB6CeCd0176\", \n",
    "    base_url=\"https://api.openai-hub.com/v1\",\n",
    "    show_progress_bar=True\n",
    "    )\n",
    "# 保存\n",
    "def save_vector_store(textChunks):\n",
    "    db = FAISS.from_texts(textChunks, embeddings)\n",
    "    db.save_local('faiss')\n",
    " \n",
    " \n",
    "# 加载\n",
    "def load_vector_store():\n",
    "    return FAISS.load_local('faiss', embeddings, allow_dangerous_deserialization=True)\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/mac/Library/Python/3.9/lib/python/site-packages/langchain_core/_api/deprecation.py:119: LangChainDeprecationWarning: The class `ChatOpenAI` was deprecated in LangChain 0.0.10 and will be removed in 0.3.0. An updated version of the class exists in the langchain-openai package and should be used instead. To use it run `pip install -U langchain-openai` and import as `from langchain_openai import ChatOpenAI`.\n",
      "  warn_deprecated(\n"
     ]
    }
   ],
   "source": [
    "from langchain.chains import RetrievalQA\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.prompts import PromptTemplate\n",
    " \n",
    " \n",
    "llm = ChatOpenAI(\n",
    "    openai_api_key=\"sk-uRUknVzF2daRmidJ227fEa256c5d4f4b9f9a7bB6CeCd0176\", \n",
    "    base_url=\"https://api.openai-hub.com/v1\", \n",
    "    model_name='gpt-3.5-turbo')\n",
    "\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.callbacks import StdOutCallbackHandler\n",
    "\n",
    "# 获取检索型问答链\n",
    "def get_qa_chain(vector_store):\n",
    "    prompt_template = \"\"\"基于以下已知内容，简洁和专业的来回答用户的问题。\n",
    "                                            如果无法从中得到答案，清说\"根据已知内容无法回答该问题\"\n",
    "                                            答案请使用中文。\n",
    "                                            已知内容:\n",
    "                                            {context}\n",
    "                                            问题:\n",
    "                                            {question}\"\"\"\n",
    " \n",
    "    prompt = PromptTemplate(template=prompt_template,\n",
    "                            input_variables=[\"context\", \"question\"])\n",
    "    handler = StdOutCallbackHandler()\n",
    "    return RetrievalQA.from_llm(llm=llm, retriever=vector_store.as_retriever(), prompt=prompt, verbose=True, callbacks=[handler])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#pdf_chunks[0:2]\n",
    "#save_vector_store(pdf_chunks[0:2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new RetrievalQA chain...\u001b[0m\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "01f7ce5357b24c6babd9b52a0cc16672",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new StuffDocumentsChain chain...\u001b[0m\n",
      "\n",
      "\n",
      "\u001b[1m> Entering new LLMChain chain...\u001b[0m\n",
      "Prompt after formatting:\n",
      "\u001b[32;1m\u001b[1;3m基于以下已知内容，简洁和专业的来回答用户的问题。\n",
      "                                            如果无法从中得到答案，清说\"根据已知内容无法回答该问题\"\n",
      "                                            答案请使用中文。\n",
      "                                            已知内容:\n",
      "                                            Context:\n",
      "基本信息  \n",
      "姓       名：袁业涵  / 男  / 1995\n",
      "工作经验： 7 年\n",
      "求职意向： Java 工程师\n",
      "政治面貌：党员\n",
      "手       机： 17280164205 （同微信）\n",
      "邮       箱： 1547849737@qq.com\n",
      "技术博客： https://www.youlike.tech/\n",
      " \n",
      "教育背景  \n",
      "2013.09 - 2017.06 ：中原工学院  / 软件工程  / 学士学位  \n",
      " \n",
      "技术清单  \n",
      "7年工作经验， 3 年小组管理经验，具有全栈开发能力，擅长订单、支付、 SAAS 等业务领域\n",
      "【Java】熟练掌握  Java 核心知识：集合、泛型、反射、 JUC 等\n",
      "【JVM】深入理解  JVM 底层原理，熟悉  JVM 各类垃圾收集器的使用和核心参数的调优，具备实际的  \n",
      "JVM 调优经验\n",
      "【设计模式】熟练掌握  Java 常用设计模式，具备良好的编码规范和设计原则\n",
      "【MySQL 】熟悉  MySQL 数据库，理解其索引、事务、 MVCC 、锁等机制，熟悉读写分离、分库分\n",
      "表等方案，有过线上  SQL 调优经验\n",
      "\n",
      "Context:\n",
      "【JVM】深入理解  JVM 底层原理，熟悉  JVM 各类垃圾收集器的使用和核心参数的调优，具备实际的  \n",
      "JVM 调优经验\n",
      "【设计模式】熟练掌握  Java 常用设计模式，具备良好的编码规范和设计原则\n",
      "【MySQL 】熟悉  MySQL 数据库，理解其索引、事务、 MVCC 、锁等机制，熟悉读写分离、分库分\n",
      "表等方案，有过线上  SQL 调优经验\n",
      "【Redis】熟练掌握  Redis ，理解  Redis 核心数据结构的使用场景，熟悉缓存雪崩、穿透等缓存高并\n",
      "发问题的解决方案，曾实现过分布式锁、延迟消息、幂等性、限流等特性。\n",
      "【微服务】熟练使用 SpringCloudAlibaba 、 Nacos 、 OpenFeign 、 Sentinel 、 Gateway 等搭建微服\n",
      "务框架进行整合开发\n",
      "【中间件】熟悉  RocketMQ 、 RabbitMQ 、 Kafka 等常用消息中间件，能够进行消息的异步解耦。熟\n",
      "练掌握分布式场景下的常见技术解决方案，比如  Seata 分布式事务、 XXL-Job 分布式任务调度、\n",
      "SkyWalking 分布式链路追踪\n",
      "                                            问题:\n",
      "                                            基本信息\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n",
      "{'query': '基本信息', 'result': '姓名：袁业涵\\n性别：男\\n出生年份：1995\\n工作经验：7年\\n求职意向：Java工程师\\n政治面貌：党员\\n联系电话：17280164205\\n电子邮箱：1547849737@qq.com\\n技术博客：https://www.youlike.tech/'}\n"
     ]
    }
   ],
   "source": [
    "vector_store = load_vector_store()\n",
    "chain = get_qa_chain(vector_store)\n",
    "\n",
    "text = \"基本信息\"\n",
    "response = chain({\"query\": text})\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.chains import RetrievalQA, ConversationalRetrievalChain\n",
    "from langchain.chat_models import ChatOpenAI\n",
    "from langchain.prompts import PromptTemplate\n",
    "from langchain.text_splitter import RecursiveCharacterTextSplitter\n",
    "import langchain\n",
    "import request\n",
    "\n",
    "vector_store = load_vector_store()\n",
    " \n",
    "chain = langchain.get_history_chain(vector_store)\n",
    "\n",
    "# 使用session缓存对话\n",
    "chat_history = request[\"session\"].get(\"chat_history\")\n",
    "if chat_history is None:\n",
    "    chat_history = []\n",
    "\n",
    "# Convert chat history to list of tuples\n",
    "chat_history_tuples = []\n",
    "for message in chat_history:\n",
    "    chat_history_tuples.append((message[0], message[1]))\n",
    "\n",
    "response = chain({\"question\": text, \"chat_history\": chat_history_tuples})\n",
    "print(\"response\", response)\n",
    "\n",
    "# 保存聊天记录\n",
    "chat_history.append((text, response[\"answer\"]))\n",
    "# 处理chat_history的长度，避免token过长\n",
    "chat_history = chat_history[0: 10]\n",
    "\n",
    "# 重新保存到session\n",
    "request[\"session\"][\"chat_history\"] = chat_history\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
